package com.zpark;

public class Permutation {
    /*
     * 产生str[s:e]中的元素全排列
     */
    public static void permutation(String[] str, int s, int e){

        //将问题规模为n的一组元素不断进行拆分，拆分到只剩一个元素的情况
        if( s == e) {

            for (int i = 0; i <= e; i++) {

                System.out.print(str[i]);

            }

            System.out.println();

        } else {

            for (int i = s; i <= e; i++) {

                swap(str, s, i);

                //将问题规模为s:e的情况进行拆分，拆分为 1 和 s+1:e 的情况，并对s+1:e的问题进行递归调用，继续进行分割
                permutation(str, s + 1, e);

                swap(str, s, i);

            }

        }

    }

    /*
     * 对作为参数的数组str，交换第i和第j个元素
     */
    public static void swap(String[] str, int i, int j){

        String temp = (String) str[i];
        str[i] = str[j];
        str[j] = temp;
    }

    /*
     * 测试主方法
     */
    public static void main(String[] args) {

        String[] list = new String[]{"a","b","c","d","e","f"};
        permutation(list, 0, 5);
    }
}
